/*global pi */

pi.mod.define('pi.vector', function (pi) {
	"use strict";
	var module = {},
		vcalls = [
			// 创建容器
			// module.create ()
			["pi_vector_new", pi.vcall.TYPE_INT, [], "create"],

			// 释放容器
			// 注意，容器里面的指针不会被free
			// module.free (handle)
			["pi_vector_free", pi.vcall.TYPE_VOID, [pi.vcall.TYPE_INT], "free"],

			// 重置容器
			// 注意，容器里面的指针不会被free
			// module.reset(handle)
			["pi_vector_clear", pi.vcall.TYPE_VOID, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT], "reset"],

			// 返回容器当前的元素个数
			// module.getSize (handle)
			["pi_vector_size", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT], "getSize"],

			// 将C层指针data拷到容器handle
			// data: 必须是C层的指针
			// module.push (handle, data)
			["pi_vector_push", pi.vcall.TYPE_VOID, [pi.vcall.TYPE_INT, pi.vcall.TYPE_POINTER], "push"],

			// 将容器最后一个元素放回
			// module.peek(handle)
			["pi_vector_peek", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT], "peek"],

			// 将容器最后一个元素弹出并返回
			// module.pop(handle)
			["pi_vector_pop", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT], "pop"],

			// 返回索引index对应的元素
			// module.get (handle, index)
			["pi_vector_get", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT], "get"],

			// 往索引为index的元素设置值data
			// 返回原来的元素
			// 注：index不能超出handle的大小
			// module.set (handle, index, data)
			["pi_vector_set", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT, pi.vcall.TYPE_INT], "set"],

			["pi_vector_insert", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT, pi.vcall.TYPE_INT]],

			// 移除指定索引的元素并返回
			// module.remove (handle, index)
			["pi_vector_remove", pi.vcall.TYPE_INT, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT], "remove"],

			// 拷贝向量：2个参数必须都是PiVector的指针
			// module.copy (dstHandle, srcHandle)
			["pi_vector_copy", pi.vcall.TYPE_VOID, [pi.vcall.TYPE_INT, pi.vcall.TYPE_INT], "copy"]
		];
	
	// 注册所有 vcall 函数句柄
	pi.vcall.makeVCall("pi_lib.dll", module, vcalls);
	
	// 在指定位置插入元素，返回是否成功
	module.insert = function (handle, index, data) {
		return 1 === vcalls.pi_vector_insert(handle, index, data);
	};

	return module;
});